import unittest
from unittest.mock import patch

from pyecharts import options as opts
from pyecharts.charts import Pie
from pyecharts.faker import Faker


class TestPieChart(unittest.TestCase):
    @patch("pyecharts.render.engine.write_utf8_html_file")
    def test_pie_base(self, fake_writer):
        c = (
            Pie()
            .add("", [list(z) for z in zip(Faker.choose(), Faker.values())])
            .set_series_opts(label_opts=opts.LabelOpts(formatter="{b}: {c}"))
        )
        c.render()
        _, content = fake_writer.call_args[0]
        self.assertEqual(c.theme, "white")
        self.assertEqual(c.renderer, "canvas")

    @patch("pyecharts.render.engine.write_utf8_html_file")
    def test_pie_item_base(self, fake_writer):
        d = [
            opts.PieItem(name="河马", value=131),
            opts.PieItem(name="蟒蛇", value=89),
            opts.PieItem(name="老虎", value=149),
            opts.PieItem(name="大象", value=178),
        ]
        c = (
            Pie()
            .add("", d)
            .set_series_opts(label_opts=opts.LabelOpts(formatter="{b}: {c}"))
        )
        c.render()
        _, content = fake_writer.call_args[0]
        self.assertEqual(c.theme, "white")
        self.assertEqual(c.renderer, "canvas")

    @patch("pyecharts.render.engine.write_utf8_html_file")
    def test_pie_dataset(self, fake_writer):
        c = (
            Pie()
            .add_dataset(
                source=[
                    ["product", "2012", "2013", "2014", "2015", "2016", "2017"],
                    ["Matcha Latte", 41.1, 30.4, 65.1, 53.3, 83.8, 98.7],
                    ["Milk Tea", 86.5, 92.1, 85.7, 83.1, 73.4, 55.1],
                    ["Cheese Cocoa", 24.1, 67.2, 79.5, 86.4, 65.2, 82.5],
                    ["Walnut Brownie", 55.2, 67.1, 69.2, 72.4, 53.9, 39.1],
                ]
            )
            .add(
                series_name="Matcha Latte",
                data_pair=[],
                radius=60,
                center=["25%", "30%"],
                encode={"itemName": "product", "value": "2012"},
            )
            .add(
                series_name="Milk Tea",
                data_pair=[],
                radius=60,
                center=["75%", "30%"],
                encode={"itemName": "product", "value": "2013"},
            )
            .add(
                series_name="Cheese Cocoa",
                data_pair=[],
                radius=60,
                center=["25%", "75%"],
                encode={"itemName": "product", "value": "2014"},
            )
            .add(
                series_name="Walnut Brownie",
                data_pair=[],
                radius=60,
                center=["75%", "75%"],
                encode={"itemName": "product", "value": "2015"},
            )
            .set_global_opts(
                title_opts=opts.TitleOpts(title="Dataset simple pie example"),
                legend_opts=opts.LegendOpts(pos_left="30%", pos_top="2%"),
            )
        )
        c.render()
        _, content = fake_writer.call_args[0]
        self.assertEqual(c.theme, "white")
        self.assertEqual(c.renderer, "canvas")
        self.assertIn("dataset", content)
